/* 树状数组
* 1.时间复杂度:
    快速求前缀和 O(logn)
    修改某一个数 O(logn)    

* 2.原理:
    二进制
    (L, R] 区间长度就是每个二进制对应的1的值, 区间就可以表示成(R-lowbit(R)+1, R] 其中lowbit为求R对应二进制最后一位(最低位)"1"所对应的次幂
    C[R]表示以i结尾, 长度为lowbit(R)的 (R-lowbit(R)+1, R]
    C15 = (15 - 2^0, 15] C8 = (8-2^3, 8]

    子节点找父节点:
        依次枚举当前最低为位"1"的之前(高位)的最低位"1", 枚举的所有数即当前节点会影响的父节点

    最后一位"1"之后即全为0, 子区间以递归的思想依次枚举
    e.g. 当末尾有k个0, 即k+1位为最后一位1时, Cx表示以x结尾, 长度是2^k的区间和
         求子区间时, 从低位向高位依次枚举最低位1, 且之前至k+1位全部为1

* 3.code
    lowbit:
        int lowbit(int x)
        {
            return x&-x;
        }

    更改：ax + c 1~x 
            for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c; tr树状数组哈希表

    查询：
        for(int i=x;i;i-=lowbit(i)) sum+=tr[i];

    

* 本题: 
    单点加，范围求
*/

#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm> 
#include <vector>
// #define ONLINE_GUDGE
using namespace std;
#define lowbit(x) (x&-x)
const int N = 2e5 + 10;
using LL = long long;
int n;
int a[N], great[N], lower[N], tr[N]; 
/*
原始数组 
great[i]:a[i]~n之间,一共有多少个数 
lower[i]:1~a[i],一共有多少个数
哈希，tr[i]表示高度为i的节点对应的区间[i - lowbit(i) + 1, i]中的数的个数
*/

inline int sum(int x)
{
    int res = 0;
    for(int i = x; i; i -= lowbit(i))
       res+=tr[i];

    return res;
}

inline void add(int x, int c)
{
    for(int i = x; i <= n; i += lowbit(i))
        tr[i] += c;
    return;
}

int main()
{

    #ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);   
	cin.tie(0);
    #else
    freopen("./in.txt","r",stdin);
    #endif

    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++){ // 计算左边的值
        great[i] = sum(n) - sum(a[i]); // a[i]~n之间，一共有多少个数
        lower[i] = sum(a[i] - 1); // 1~a[i]-1, 即不包含a[i], 一共有多少个数
        add(a[i], 1);
    }
    cerr << "GREAT LOWER FINISH\n";
    memset(tr, 0, sizeof tr);
    LL V = 0, M = 0;
    for(int i = n; i; i--) // 计算右边的值
    {
        V += great[i] * 1ll * (sum(n) - sum(a[i])); // 左侧比自己大的*右侧比自己大的
        M += lower[i] * 1ll * (sum(a[i] - 1)); // 左侧比自己小的*右侧比自己小的
        add(a[i], 1);
        // printf("%d: V:%d M:%d\n",i, V, M);
    }
    cout << V << ' ' << M << endl;
    return 0;
}
